package cn.wen.mybatis.framework.scripting.xmltags;

import java.util.List;

/**
 * choose标签解析
 * <choose>
 *    <when test="username !=null ">
 *       u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')
 *    </when >
 *    <when test="sex != null and sex != '' ">
 *       AND u.sex = #{sex, jdbcType=INTEGER}
 *    </when >
 *    <when test="birthday != null ">
 *       AND u.birthday = #{birthday, jdbcType=DATE}
 *    </when >
 *    <otherwise>
 *    </otherwise>
 * </choose>
 *
 */
/**
 * 由<choose></choose>标签的DTD定义可知，<when></when>标签可以有多个，而<otherwise></otherwise>只能有
 * 一个。所以defaultSqlNode为一个对象，而ifSqlNodes是一个集合。
 */
public class ChooseSqlNode implements SqlNode {

  //对应于<otherwise></otherwise>
  private final SqlNode defaultSqlNode;

  //对应于<when></when>
  private final List<SqlNode> ifSqlNodes;

  public ChooseSqlNode(List<SqlNode> ifSqlNodes, SqlNode defaultSqlNode) {
    this.ifSqlNodes = ifSqlNodes;
    this.defaultSqlNode = defaultSqlNode;
  }

  @Override
  public boolean apply(DynamicContext context) {
    //遍历ifSqlNodes集合，查找条件成立的SqlNode
    for (SqlNode sqlNode : ifSqlNodes) {
      if (sqlNode.apply(context)) {
        return true;
      }
    }
    //如果ifSqlNodes集合中的所有节点的条件都不成立，则使用该兜底方案
    if (defaultSqlNode != null) {
      defaultSqlNode.apply(context);
      return true;
    }
    return false;
  }
}

